"""
认证相关的API路由
FastAPI 使用路由来组织API端点
"""
from datetime import timedelta
from fastapi import APIRouter, Depends, HTTPException, status
from fastapi.security import OAuth2PasswordRequestForm
from sqlalchemy.orm import Session

from ..database import get_db
from ..models.user import User
from ..schemas.auth import UserLogin, UserCreate, UserResponse, Token
from ..utils.auth import verify_password, get_password_hash, create_access_token
from ..dependencies import get_current_active_user
from ..config import settings


# 创建路由器
# prefix="/api/auth" 表示所有路由都会以 /api/auth 开头
# tags=["认证"] 用于API文档分组
router = APIRouter(prefix="/api/auth", tags=["认证"])


@router.post("/login", response_model=Token, summary="用户登录")
async def login(
    user_credentials: UserLogin,
    db: Session = Depends(get_db)
):
    """
    用户登录接口

    这个函数演示了FastAPI的几个重要概念：
    1. 路由装饰器：@router.post() 定义POST请求
    2. 响应模型：response_model=Token 自动验证和序列化响应
    3. 依赖注入：Depends(get_db) 自动注入数据库会话
    4. 请求体验证：user_credentials 自动验证请求JSON

    Args:
        user_credentials: 用户登录信息（用户名和密码）
        db: 数据库会话（通过依赖注入）

    Returns:
        Token: 包含访问令牌的响应

    Raises:
        HTTPException: 登录失败时返回401错误
    """
    # 从数据库查询用户
    user = db.query(User).filter(User.username == user_credentials.username).first()

    # 验证用户存在且密码正确
    if not user or not verify_password(user_credentials.password, user.hashed_password):
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail="用户名或密码错误",
            headers={"WWW-Authenticate": "Bearer"},
        )

    # 检查用户是否激活
    if not user.is_active:
        raise HTTPException(
            status_code=status.HTTP_400_BAD_REQUEST,
            detail="用户账户已被禁用"
        )

    # 创建访问令牌
    access_token_expires = timedelta(minutes=settings.access_token_expire_minutes)
    access_token = create_access_token(
        data={"sub": user.username, "user_id": user.id},
        expires_delta=access_token_expires
    )

    return {
        "access_token": access_token,
        "token_type": "bearer",
        "expires_in": settings.access_token_expire_minutes * 60  # 转换为秒
    }


@router.post("/register", response_model=UserResponse, summary="用户注册")
async def register(
    user_data: UserCreate,
    db: Session = Depends(get_db)
):
    """
    用户注册接口

    Args:
        user_data: 用户注册信息
        db: 数据库会话

    Returns:
        UserResponse: 创建的用户信息（不包含密码）

    Raises:
        HTTPException: 用户名已存在时返回400错误
    """
    # 检查用户名是否已存在
    existing_user = db.query(User).filter(User.username == user_data.username).first()
    if existing_user:
        raise HTTPException(
            status_code=status.HTTP_400_BAD_REQUEST,
            detail="用户名已存在"
        )

    # 创建新用户
    hashed_password = get_password_hash(user_data.password)
    db_user = User(
        username=user_data.username,
        hashed_password=hashed_password,
        role=user_data.role
    )

    # 保存到数据库
    db.add(db_user)
    db.commit()
    db.refresh(db_user)  # 刷新以获取自动生成的ID等字段

    return db_user


@router.get("/me", response_model=UserResponse, summary="获取当前用户信息")
async def get_current_user_info(
    current_user: User = Depends(get_current_active_user)
):
    """
    获取当前登录用户的信息

    这个接口需要认证，演示了如何使用依赖注入来保护路由

    Args:
        current_user: 当前用户（通过依赖注入自动获取）

    Returns:
        UserResponse: 当前用户信息
    """
    return current_user